import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import org.junit.jupiter.api.Test;

import java.nio.file.Paths;
import java.sql.Types;
import java.util.*;

import static javax.swing.UIManager.put;

public class 代码生成器_plus {

/**
 *
 * 代码生成器步骤：
 * 1、修改数据库连接信息，URL、用户名、密码
 1.1、如果需要设置指定地址，在62行补充地址
 * 2、修改开发作者（26行）
 * 3、调整生成表名（56行）需要生成全部的表的话注释这行就行
 * 4、执行生成器生成代码
 * @param args
 */
public static void main(String[] args) {
    FastAutoGenerator.create("jdbc:mysql://154.222.18.193:13106/ecnu_server?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8",
                    "root",
                    "zhudanian")
            .globalConfig(builder -> {
                builder.author("zdn") // *****设置开发作者*****
                        .enableSwagger() // 开启 swagger 模式
                        .outputDir("ecnu-system\\src\\main\\java"); // 指定输出目录
            })
            .dataSourceConfig(builder ->
                    builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                        int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                        if (typeCode == Types.SMALLINT) {
                            // 自定义类型转换
                            return DbColumnType.INTEGER;
                        }
                        return typeRegistry.getColumnType(metaInfo);
                    })
            )
            .packageConfig(builder ->
                            builder.parent("com.ecnu") // 设置父包名
//                                .moduleName("system") // 设置父包模块名
                                    .entity("system.domain")
                                    .service("system.service")
                                    .mapper("system.mapper")
                                    .serviceImpl("system.service.impl")
                                    .controller("web.controller")
                                    .xml("mapper.xml")
                                    .pathInfo(new HashMap<OutputFile, String>() {{
                                        put(OutputFile.xml, "ecnu-system\\src\\main\\resources\\mapper\\system");
                                        put(OutputFile.controller,"ecnu-admin\\src\\main\\java\\com\\ecnu\\web\\controller" +
                                                "\\incubation");// controller 单独输出路径，按照需求调整地址
                                    }})
//                                    .pathInfo(Collections.singletonMap(OutputFile.xml,
//                                            "ecnu-system\\src\\main\\resources\\mapper\\system")) // 设置mapperXml生成路径
//                                    .pathInfo(Collections.singletonMap(OutputFile.controller,
//                                            "ecnu-admin\\src\\main\\java\\com\\ecnu\\web\\controller")) // controller 单独输出路径
            )
            .strategyConfig(builder ->
                    builder.addInclude("software_tool") // ******设置需要生成的表名   注意，需要生成全部的表的话注释这行就行*******
                            .addTablePrefix("t_", "c_", "sys_") // 设置过滤表前缀
            )
            .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
            .execute();

}

    /**
     * 代码生成器步骤：(暂时有点问题，mapperxml文件要手动迁移，controller 文件要手动迁移)
     * 1、修改数据库连接信息，URL、用户名、密码
     * 2、执行生成器生成代码
     *
     * @param args
     */
//    public static void main(String[] args) {
//        FastAutoGenerator.create("jdbc:mysql://154.222.18.193:13106/ecnu_server?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8",
//                        "root",
//                        "zhudanian")
//                // 全局配置
//                .globalConfig((scanner, builder) -> builder.author(scanner.apply("请输入作者名称？"))
//                                .outputDir("ecnu-system\\src\\main\\java") // 指定输出目录
//                                .enableSwagger()
//                        // 开启 swagger 模式
//                )
//                // 包配置
//                .packageConfig((scanner, builder) -> builder.parent("com.ecnu")
//                        .moduleName("system")  // 添加 moduleName
//                        .entity("domain")
//                        .service("service")
//                        .mapper("mapper")
//                        .serviceImpl("service.impl")
//                        .controller("web.controller")
//                        .pathInfo(new HashMap<OutputFile, String>() {{
//                            put(OutputFile.xml, "ecnu-system/src/main/resources/mapper/system");
//                            put(OutputFile.mapper, "ecnu-system/src/main/java");
//                        }})
//                        .pathInfo(Collections.singletonMap(OutputFile.controller,
//                                "ecnu-admin\\src\\main\\java\\com\\ecnu\\web\\controller"))
//                )
//                // 策略配置
//                .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名，多个英文逗号分隔？所有输入 all")))
//                                .addTablePrefix("t_", "c_", "sys_")
////                        // 实体类配置
////                        .entityBuilder()
////                        .enableLombok()
////                        .addTableFills(
////                                new Column("create_time", FieldFill.INSERT)
////                        )
//                )
//                // 使用Freemarker引擎模板，默认的是Velocity引擎模板
//                .templateEngine(new FreemarkerTemplateEngine())
//                .execute();
//    }

    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
}
